package sha256

import (
	"crypto/hmac"
	"crypto/sha256"
)

// 给数据签名，返回拼接好hash的最终数据
func SignWithSha256(data []byte, secret string) (signedData []byte) {
	//预计总长度，后用copy写入避免多次分配内存,最高效
	dateLen := len(data)
	signedData = make([]byte, dateLen+32)
	copy(signedData, data)
	h := hmac.New(sha256.New, []byte(secret))
	h.Write(data)
	hash := h.Sum(nil)
	copy(signedData[dateLen:], hash)
	return
}

func VerifyBySha256(data []byte, hash []byte, secret string) (success bool) {
	h2 := hmac.New(sha256.New, []byte(secret))
	h2.Write(data)
	expectedHMAC := h2.Sum(nil)
	success = hmac.Equal(expectedHMAC, hash)
	return
}

// 将签过名的数据拆分出数据和hash
func Split2DataAndHash(body []byte) (data []byte, hash []byte) {
	dataLen := len(body) - 32
	data = body[:dataLen]
	hash = body[dataLen:]
	return
}
